/**
 * 你是一个专业的小偷，计划偷窃沿街的房屋。每间房内都藏有一定的现金，影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统，如果两间相邻的房屋在同一晚上被小偷闯入，系统会自动报警。
 *
 * 给定一个代表每个房屋存放金额的非负整数数组，计算你 不触动警报装置的情况下 ，一夜之内能够偷窃到的最高金额。
 *
 *https://leetcode.cn/problems/house-robber/description/
 * 题解：https://labuladong.gitee.io/algo/3/28/95/
 */
class Rob {
    int[] memo;
    public int robDpMemo(int[] nums) {
        int n=nums.length;
        memo=new int[n];
        Arrays.fill(memo,-1);
        return dp(nums,0);
    }
    public int dp(int[] nums,int i) {
        if(i>=nums.length) {
            return 0;
        }
        if(memo[i]!=-1) {
            return memo[i];
        }
        memo[i]=Math.max(nums[i]+dp(nums,i+2),dp(nums,i+1));
        return memo[i];
    }
    public int robDpTable(int[] nums) {
        int n=nums.length;
        int[] dp=new int[n+2];
        for(int i=n-1;i>=0;i--) {
            dp[i]=Math.max(dp[i+1],nums[i]+dp[i+2]);
        }
        return dp[0];
    }
    
}